2022年1月15日
Jerry
3473
2023年11月6日
使用ESP8266开发一个实时电子气象表,主要实现功能有 时间、日期、星期、室内温湿度、天气预报等功能。
上一篇写了下关于 星期、时间、温湿度的获取与显示,这一篇讲一下如何通过网络获取天气信息。
1、天气信息:
天气信息来自 “心知天气”,注册后可以免费使用其API接口: 产品文档
获取实时天气,key换自己申请的KEY
http://api.seniverse.com/v3/weather/now.json?key=xxxxx&location=suzhou&language=zh-Hans
{
"results": [{
"location": {
"id": "WTTDPCGXTWUS",
"name": "苏州",
"country": "CN",
"path": "苏州,苏州,江苏,中国",
"timezone": "Asia/Shanghai",
"timezone_offset": "+08:00"
},
"now": {
"text": "晴",
"code": "0",
"temperature": "7"
},
"last_update": "2022-01-15T11:48:06+08:00"
}]
}
arduinuo如何发起请求并解析json信息呢? 代码DEMO如下:
#include <ESP8266HTTPClient.h>
void getWeather()
{
WiFiClient tcpClient;
HTTPClient httpClient;
httpClient.begin(tcpClient, "http://api.seniverse.com/v3/weather/now.json?key=xxx&location=suzhou&language=zh-Hans");
int httpCode = httpClient.GET();
if (httpCode == HTTP_CODE_OK)
{
String Payload = httpClient.getString(); // 使用getString函数获取服务器响应体内容
// Allocate the JSON document
// Use https://arduinojson.org/v6/assistant to compute the capacity.
StaticJsonDocument<512> doc;
DeserializationError error = deserializeJson(doc, Payload);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
JsonObject results_0 = doc["results"][0];
JsonObject results_0_now = results_0["now"];
const char* nowWeatherCode1 = results_0_now["code"]; //
const char* results_0_last_update = results_0["last_update"];
}
else
{
Serial.print("\r\nServer Respose Code: ");
Serial.println(httpCode);
String Payload = httpClient.getString();
Serial.println(Payload);
}
/* 5. 关闭ESP8266与服务器的连接 */
httpClient.end();
}
对于json的解析,这里提供了一个网址,可以直接生成代码:https://arduinojson.org/v6/assistant 填写相关信息后,最后能直接生成json解析代码,非常方便!
直接把代码考进去就完事,最后解析得到想要的信息。其他获取明后天天气预报方法类似。
2、关于 页面自动切换(时间-明天天气-后天天气)
这里用到了 ESP8266内置的定时器库--Ticker库
void once(float seconds, callback_function_t callback); xx秒后只执行一次-----不带参数
void once(float seconds, callback_function_t callback,TArg arg); xx秒后只执行一次-----带参数
void once_ms(float seconds, callback_function_t callback) xx毫秒后只执行一次
void once_ms(float seconds, callback_function_t callback,TArg arg) xx毫秒后只执行一次
void attach(float seconds, callback_function_t callback); 每隔xx秒周期性执行
void attach(float seconds, callback_function_t callback,TArg arg); 每隔xx秒周期性执行
void attach_ms(float seconds, callback_function_t callback); 每隔xx毫秒周期性执行
void attach_ms(float seconds, callback_function_t callback,TArg arg); 每隔xx毫秒周期性执行
于是,切换的方法如下:
#include <Ticker.h>
Ticker changeShow;
int changeShowInt = 0;
void tickerchangeShowInt()
{
changeShowInt++;
}
void setup() {
changeShow.attach(1, tickerchangeShowInt);
}
void loop() {
//显示 8s 时间
if(changeShowInt<=8)
{
showTime();
}
// 显示4s 明日天气
else if(changeShowInt<=12)
{
showWeather(winfo[0]);
}
// 显示 4s 后天天气
else if(changeShowInt<=16)
{
showWeather(winfo[1]);
}
//重置
else
{
changeShowInt=0;
}
}
完结!
原创文章,转载请注明出处:
https://jerrycoding.com/article/esp8266-clock-2
《物联网开发》
0
微信
支付宝